home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / hack / 2_3 / u_init.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-20  |  13.0 KB  |  591 lines

  1. /*    SCCS Id: @(#)u_init.c    2.3    88/01/21
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3.  
  4. #include <stdio.h>
  5. #include <signal.h>
  6. #include "hack.h"
  7. #ifdef GENIX
  8. #define    void    int
  9. #endif
  10.  
  11. #define Strcpy    (void) strcpy
  12. #define    Strcat    (void) strcat
  13. #define    UNDEF_TYP    0
  14. #define    UNDEF_SPE    '\177'
  15. extern struct obj *addinv();
  16. extern char *eos();
  17. extern char plname[];
  18. #define IS_MAGIC(x)    ((x)->olet == WAND_SYM || (x)->olet == POTION_SYM || \
  19.              (x)->olet == RING_SYM || (x)->olet == SCROLL_SYM || \
  20.              (x)->olet == SPBOOK_SYM)
  21.  
  22. struct you zerou;
  23. char pl_character[PL_CSIZ];
  24. char *(roles[]) = {    /* must all have distinct first letter */
  25.             /* roles[4] & [7] may be changed for females */
  26.     "Archeologist", "Tourist", "Barbarian", "Knight", "Cave-man",
  27. #ifdef NEWCLASS
  28.     "Samurai", "Ninja", "Priest",
  29. #endif
  30. #ifdef KAA
  31.     "Valkyrie", "Elf", "Healer",
  32. #endif
  33.     "Wizard"
  34. };
  35. #define    NR_OF_ROLES    SIZE(roles)
  36. char rolesyms[NR_OF_ROLES + 1];        /* filled by u_init() */
  37.  
  38. struct trobj {
  39.     unsigned short trotyp;
  40.     schar trspe;
  41.     char trolet;
  42.     Bitfield(trquan,6);
  43.     Bitfield(trknown,1);
  44. };
  45.  
  46. #ifdef WIZARD
  47. struct trobj Extra_objs[] = {
  48.     { 0, 0, 0, 0, 0 },
  49.     { 0, 0, 0, 0, 0 }
  50. };
  51. #endif
  52.  
  53. struct trobj Cave_man[] = {
  54. #define C_ARROWS    2
  55.     { CLUB, 1, WEAPON_SYM, 1, 1 },
  56.     { BOW, 1, WEAPON_SYM, 1, 1 },
  57.     { ARROW, 0, WEAPON_SYM, 25, 1 },    /* quan is variable */
  58.     { LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1 },
  59.     { 0, 0, 0, 0, 0}
  60. };
  61.  
  62. struct trobj Barbarian[] = {
  63.     { TWO_HANDED_SWORD, 0, WEAPON_SYM, 1, 1 },
  64.     { RING_MAIL, 0, ARMOR_SYM, 1, 1 },
  65.     { 0, 0, 0, 0, 0 }
  66. };
  67.  
  68. struct trobj Knight[] = {
  69.     { LONG_SWORD, 0, WEAPON_SYM, 1, 1 },
  70.     { SPEAR, 2, WEAPON_SYM, 1, 1 },
  71.     { RING_MAIL, 1, ARMOR_SYM, 1, 1 },
  72.     { HELMET, 0, ARMOR_SYM, 1, 1 },
  73.     { SHIELD, 0, ARMOR_SYM, 1, 1 },
  74.     { PAIR_OF_GLOVES, 0, ARMOR_SYM, 1, 1 },
  75.     { 0, 0, 0, 0, 0 }
  76. };
  77.  
  78. #ifdef KAA
  79. struct trobj Elf[] = {
  80. #define E_ARROWS    2
  81. #define E_ARMOR        3
  82.     { SHORT_SWORD, 0, WEAPON_SYM, 1, 1 },
  83.     { BOW, 0, WEAPON_SYM, 1, 1 },
  84.     { ARROW, 0, WEAPON_SYM, 25, 1 },
  85.     { UNDEF_TYP, 0, ARMOR_SYM, 1, 1 },
  86.     { 0, 0, 0, 0, 0 }
  87. };
  88.  
  89. struct trobj Valkyrie[] = {
  90.     { LONG_SWORD, 1, WEAPON_SYM, 1, 1 },
  91.     { SHIELD, 3, ARMOR_SYM, 1, 1 },
  92.     { FOOD_RATION, 0, FOOD_SYM, 1, 1 },
  93.     { 0, 0, 0, 0, 0 }
  94. };
  95.  
  96. struct trobj Healer[] = {
  97.     { STETHOSCOPE, 0, TOOL_SYM, 1, 0 },
  98.     { POT_HEALING, 0, POTION_SYM, 4, 1 },
  99.     { POT_EXTRA_HEALING, 0, POTION_SYM, 4, 1 },
  100.     { APPLE, 0, FOOD_SYM, 5, 0 },
  101.     { 0, 0, 0, 0, 0}
  102. };
  103. #endif /* KAA /**/
  104.  
  105. struct trobj Archeologist[] = {
  106.     { STUDDED_LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1 },
  107.     { UNDEF_TYP, 0, POTION_SYM, 2, 0 },
  108.     { FOOD_RATION, 0, FOOD_SYM, 3, 1 },
  109.     { PICK_AXE, UNDEF_SPE, TOOL_SYM, 1, 0 },
  110.     { ICE_BOX, 0, TOOL_SYM, 1, 0 },
  111.     { 0, 0, 0, 0, 0}
  112. };
  113.  
  114. struct trobj Tinopener[] = {
  115.     { CAN_OPENER, 0, TOOL_SYM, 1, 1 },
  116.     { 0, 0, 0, 0, 0 }
  117. };
  118.  
  119. #ifdef MARKER
  120. struct trobj Magicmarker[] = {
  121.     { MAGIC_MARKER, 50, TOOL_SYM, 1, 0 },
  122.     { 0, 0, 0, 0, 0 }
  123. };
  124. #endif
  125.  
  126. struct trobj Lamp[] = {
  127.     { LAMP, 5, TOOL_SYM, 1, 0 },
  128.     { 0, 0, 0, 0, 0 }
  129. };
  130.  
  131. #ifdef WALKIES
  132. struct trobj Leash[] = {
  133.     { LEASH, 0, TOOL_SYM, 1, 0 },
  134.     { 0, 0, 0, 0, 0 }
  135. };
  136. #endif
  137.  
  138. struct trobj Blindfold[] = {
  139.     { BLINDFOLD, 0, TOOL_SYM, 1, 0 },
  140.     { 0, 0, 0, 0, 0 }
  141. };
  142.  
  143. struct trobj Tourist[] = {
  144. #define    T_DARTS        3
  145.     { UNDEF_TYP, 0, FOOD_SYM, 10, 1 },
  146.     { POT_EXTRA_HEALING, 0, POTION_SYM, 2, 0 },
  147.     { EXPENSIVE_CAMERA, 0, TOOL_SYM, 1, 1 },
  148.     { DART, 2, WEAPON_SYM, 25, 1 },    /* quan is variable */
  149. #ifdef SHIRT
  150.     { HAWAIIAN_SHIRT, 0, ARMOR_SYM, 1, 1 },
  151. #endif
  152.     { 0, 0, 0, 0, 0 }
  153. };
  154.  
  155. struct trobj Wizard[] = {
  156. #define W_MULTSTART    2
  157. #define W_MULTEND    6
  158.     { ELVEN_CLOAK, 0, ARMOR_SYM, 1, 1 },
  159.     { DAGGER, 0, WEAPON_SYM, 1, 1 },    /* for dealing with ghosts */
  160.     { UNDEF_TYP, UNDEF_SPE, WAND_SYM, 2, 1 },
  161.     { UNDEF_TYP, UNDEF_SPE, RING_SYM, 2, 1 },
  162.     { UNDEF_TYP, UNDEF_SPE, POTION_SYM, 2, 1 },
  163.     { UNDEF_TYP, UNDEF_SPE, SCROLL_SYM, 3, 1 },
  164. #ifdef SPELLS
  165.     { UNDEF_TYP, UNDEF_SPE, SPBOOK_SYM, 3, 1 },
  166. #endif
  167.     { 0, 0, 0, 0, 0 }
  168. };
  169.  
  170. #ifdef NEWCLASS
  171. struct    trobj    Samurai[] = {
  172. #define S_ARROWS    3
  173.     { KATANA, 0, WEAPON_SYM, 1, 1 },
  174.     { SHORT_SWORD, 0, WEAPON_SYM, 1, 1 },    /* the wakizashi */
  175.     { BOW,    1, WEAPON_SYM, 1, 1 },
  176.     { ARROW,  0, WEAPON_SYM, 25, 1 },    /* quan is variable */
  177.     { SPLINT_MAIL, 0, ARMOR_SYM, 1, 1},
  178.     { 0, 0, 0, 0, 0 }
  179. };
  180.  
  181. struct    trobj    Ninja[] = {
  182. #define N_SHURIKEN    1
  183.     { KATANA, 0, WEAPON_SYM, 1, 1 },
  184.     { SHURIKEN, 0, WEAPON_SYM, 25, 1 },    /* quan is variable */
  185.     { LEATHER_ARMOR, 1, ARMOR_SYM, 1, 1},
  186.     { 0, 0, 0, 0, 0 }
  187. };
  188.  
  189. struct    trobj    Priest[] = {
  190.     { CHAIN_MAIL, 0, ARMOR_SYM, 1, 1 },
  191.     { SHIELD, 0, ARMOR_SYM, 1, 1 },
  192.     { MACE, 1, WEAPON_SYM, 1, 1 },
  193.     { POT_HOLY_WATER, 0, POTION_SYM, 4, 1 },
  194. #ifdef SPELLS
  195.     { UNDEF_TYP, UNDEF_SPE, SPBOOK_SYM, 2, 0 },
  196. #endif
  197.     { 0, 0, 0, 0, 0 }
  198. };
  199. #endif /* NEWCLASS /**/
  200.  
  201. u_init(){
  202. register int i;
  203. char exper = 'y', pc;
  204. extern char readchar();
  205.     if(flags.female)  {    /* should have been set in HACKOPTIONS */
  206.         roles[4] = "Cave-woman";
  207. #ifdef NEWCLASS
  208.         roles[7] = "Priestess";
  209. #endif
  210.     }
  211.     for(i = 0; i < NR_OF_ROLES; i++)
  212.         rolesyms[i] = roles[i][0];
  213.     rolesyms[i] = 0;
  214.  
  215.     if(pc = pl_character[0]) {
  216.         if('a' <= pc && pc <= 'z') pc += 'A'-'a';
  217.         if((i = role_index(pc)) >= 0)
  218.             goto got_suffix;    /* implies experienced */
  219.         printf("\nUnknown role: %c\n", pc);
  220.         pl_character[0] = pc = 0;
  221.     }
  222.  
  223.     printf("\nShall I pick a character for you (yes, no, or quit) ? [ynq] ");
  224.  
  225.     while(!index("yYnNqQ", (exper = readchar())))    bell();
  226.  
  227.     printf("%c\n", exper);        /* echo */
  228.  
  229.     if (index("qQ", exper)) {
  230.         clearlocks();
  231.         settty((char *) 0);
  232.         exit(0);
  233.     }
  234.  
  235.     if(index("Yy", exper)) {
  236.         exper = 0;
  237.         goto beginner;
  238.     }
  239.  
  240.     printf("\n Tell me what kind of character you are:\n");
  241.     printf(" Are you");
  242.     for(i = 0; i < NR_OF_ROLES; i++) {
  243.         printf(" %s %s", index("AEIOU",roles[i][0]) ? "an" : "a", roles[i]);
  244.         if((((i + 1) % 4) == 0) && (i != NR_OF_ROLES -1)) printf(",\n        ");
  245.         else if(i < NR_OF_ROLES - 2)    printf(",");
  246.         if(i == NR_OF_ROLES - 2)    printf(" or");
  247.     }
  248.     printf("? [%s or q(quit)] ", rolesyms);
  249.  
  250.     while(pc = readchar()) {
  251.         if (pc == 'q' || pc == 'Q') {
  252.  
  253.             clearlocks();
  254.             settty((char *) 0);
  255.             exit(0);
  256.         }
  257.         if('a' <= pc && pc <= 'z') pc += 'A'-'a';
  258.         if((i = role_index(pc)) >= 0) {
  259.             printf("%c\n", pc);    /* echo */
  260.             (void) fflush(stdout);    /* should be seen */
  261.             break;
  262.         }
  263.         if(pc == '\n') break;
  264.         bell();
  265.     }
  266.     if(pc == '\n')    pc = 0;
  267.  
  268. beginner:
  269.     if(!pc) {
  270.         i = rn2(NR_OF_ROLES);
  271.         pc = rolesyms[i];
  272.         printf("\nThis game you will be %s %s%s.\n",
  273.             (exper || index("AEIOU", roles[i][0])) ? "an" : "a",
  274.             exper ? "experienced " : "", roles[i]);
  275.         getret();
  276.         /* give him some feedback in case mklev takes much time */
  277.         (void) putchar('\n');
  278.         (void) fflush(stdout);
  279.     }
  280.     if(exper) {
  281.         roles[i][0] = pc;
  282.     }
  283.  
  284. got_suffix:
  285.  
  286.     (void) strncpy(pl_character, roles[i], PL_CSIZ-1);
  287.     pl_character[PL_CSIZ-1] = 0;
  288.     flags.beginner = 1;
  289.     u = zerou;
  290.     u.usym = '@';
  291.     u.ulevel = 1;
  292.     u.uluck  = 0;
  293.     init_uhunger();
  294.     uarm = uarm2 = uarmh = uarms = uarmg = uwep =
  295. #ifdef SHIRT
  296.     uarmu =
  297. #endif
  298.     uball = uchain = uleft = uright = 0;
  299.  
  300. #ifdef SPELLS
  301.     u.uen = u.uenmax = 1;
  302.     for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL;
  303. #endif
  304. #ifdef PRAYERS
  305.     u.ublesscnt = 300;            /* no prayers just yet */
  306.     u.ublessed = 0;                /* not worthy yet */
  307.     u.ugangr   = 0;                /* gods not angry */
  308. #endif
  309. #ifdef HARD
  310.     u.udemigod = u.udg_cnt = 0;        /* not a demi-god yet... */
  311. #endif
  312. #ifdef KAA
  313.     u.mh = u.mhmax = u.umonnum = u.mtimedone = 0;
  314. #endif
  315. #ifdef QUEST
  316.     u.uhorizon = 6;
  317. #endif
  318.     switch(pc) {
  319.     case 'c':
  320.     case 'C':
  321.         Cave_man[C_ARROWS].trquan = 12 + rnd(9)*rnd(9);
  322.         u.uhp = u.uhpmax = 16;
  323.         u.ustr = u.ustrmax = 18;
  324.         ini_inv(Cave_man);
  325.         break;
  326.     case 't':
  327.     case 'T':
  328. #ifdef KAA
  329.         objects[POT_EXTRA_HEALING].oc_name_known=1;
  330. #endif
  331.         Tourist[T_DARTS].trquan = 20 + rnd(20);
  332.         u.ugold = u.ugold0 = rnd(1000);
  333.         u.uhp = u.uhpmax = 10;
  334.         u.ustr = u.ustrmax = 8;
  335.         ini_inv(Tourist);
  336.         if(!rn2(25)) ini_inv(Tinopener);
  337.         else if(!rn2(4)) ini_inv(Lamp);
  338. #ifdef MARKER
  339.         else if(!rn2(25)) ini_inv(Magicmarker);
  340. #endif
  341. #ifdef WALKIES
  342.         else if(!rn2(25)) ini_inv(Leash);
  343. #endif
  344.         break;
  345.     case 'w':
  346.     case 'W':
  347.         for(i = W_MULTSTART; i <= W_MULTEND; i++)
  348.             if(!rn2(5))
  349.             Wizard[i].trquan += rn2(3) - 1;
  350.         u.uhp = u.uhpmax = 15;
  351.         u.ustr = u.ustrmax = 16;
  352. #ifdef SPELLS
  353.         u.uen = u.uenmax += rn2(4);
  354. #endif
  355.         ini_inv(Wizard);
  356. #ifdef MARKER
  357.         if(!rn2(5)) ini_inv(Magicmarker);
  358. #endif
  359.         if(!rn2(5)) ini_inv(Blindfold);
  360.         break;
  361.     case 'a':
  362.     case 'A':
  363.         Fast = INTRINSIC;
  364.         Stealth = INTRINSIC;
  365.         u.uhp = u.uhpmax = 12;
  366.         u.ustr = u.ustrmax = 10;
  367.         ini_inv(Archeologist);
  368.         if(!rn2(10)) ini_inv(Tinopener);
  369. #ifdef MARKER
  370.         else if(!rn2(10)) ini_inv(Magicmarker);
  371. #endif
  372.         break;
  373. #ifdef KAA
  374.     case 'e':
  375.     case 'E':
  376.         Elf[E_ARROWS].trquan = 15+rnd(20);
  377.         Elf[E_ARMOR].trotyp = (rn2(2) ? ELFIN_CHAIN_MAIL : ELVEN_CLOAK);
  378.         Fast = INTRINSIC;
  379.         HSee_invisible = INTRINSIC;
  380.         u.uhp = u.uhpmax = 16;
  381.         u.ustr = u.ustrmax = 16;
  382.         ini_inv(Elf);
  383.         if(!rn2(5)) ini_inv(Blindfold);
  384.         else if(!rn2(6)) ini_inv(Lamp);
  385.         break;
  386.     case 'v':
  387.     case 'V':
  388.         Stealth = INTRINSIC;
  389.         HCold_resistance = INTRINSIC;
  390.         flags.female = TRUE;
  391.         u.uhp = u.uhpmax = 16;
  392.         u.ustr = u.ustrmax = 17;
  393.         ini_inv(Valkyrie);
  394.         if(!rn2(6)) ini_inv(Lamp);
  395.         break;
  396.     case 'h':
  397.     case 'H':
  398.         objects[POT_HEALING].oc_name_known=1;
  399.         objects[POT_EXTRA_HEALING].oc_name_known=1;
  400.         HPoison_resistance = INTRINSIC;
  401.         u.uhp = u.uhpmax = 16;
  402.         u.ustr = u.ustrmax = 15;
  403.         ini_inv(Healer);
  404.         if(!rn2(25)) ini_inv(Lamp);
  405.         break;
  406. #endif
  407.     case 'k':
  408.     case 'K':
  409.         u.uhp = u.uhpmax = 12;
  410.         u.ustr = u.ustrmax = 10;
  411.         ini_inv(Knight);
  412.         break;
  413.     case 'b':
  414.     case 'B':
  415.         u.uhp = u.uhpmax = 14;
  416.         u.ustr = u.ustrmax = 17;
  417.         ini_inv(Barbarian);
  418.         if(!rn2(6)) ini_inv(Lamp);
  419.         break;
  420. #ifdef NEWCLASS
  421.     case 's':
  422.     case 'S':
  423.         Fast = INTRINSIC;
  424.         u.uhp = u.uhpmax = 16;
  425.         u.ustr = u.ustrmax = 16;
  426.         Samurai[S_ARROWS].trquan = 12 + rnd(9)*rnd(9);
  427.         ini_inv(Samurai);
  428.         break;
  429.     case 'n':
  430.     case 'N':
  431.         Fast = INTRINSIC;
  432.         Stealth = INTRINSIC;
  433.         u.uhp = u.uhpmax = 15;
  434.         u.ustr = u.ustrmax = 10;
  435.         Ninja[N_SHURIKEN].trquan = 12 + rnd(9)*rnd(9);
  436.         ini_inv(Ninja);
  437.         if(!rn2(5)) ini_inv(Blindfold);
  438.         break;
  439.     case 'p':
  440.     case 'P':
  441.         u.uhp = u.uhpmax = 13;
  442.         u.ustr = u.ustrmax = 15;
  443. # ifdef SPELLS
  444.         u.uen = u.uenmax += rn2(4);
  445. # endif
  446.         ini_inv(Priest);
  447. # ifdef KAA
  448.         uwep->dknown = 1;    /* bless his primary weapon */
  449. # endif
  450. # ifdef MARKER
  451.         if(!rn2(10)) ini_inv(Magicmarker);
  452. # endif
  453.         else if(!rn2(10)) ini_inv(Lamp);
  454.         objects[POT_HOLY_WATER].oc_name_known = 1;
  455.         break;
  456. #endif /* NEWCLASS /**/
  457.     default:    /* impossible */
  458.         u.uhp = u.uhpmax = 12;
  459.         u.ustr = u.ustrmax = 16;
  460.     }
  461.     find_ac();
  462.     if(!rn2(20)) {
  463.         register int d = rn2(7) - 2;    /* biased variation */
  464.         u.ustr += d;
  465.         u.ustrmax += d;
  466.     }
  467.  
  468. #ifdef WIZARD
  469.     wiz_inv();
  470. #endif
  471.     /* make sure he can carry all he has - especially for T's */
  472.     while(inv_weight() > 0 && u.ustr < 118)
  473.         u.ustr++, u.ustrmax++;
  474. }
  475.  
  476. ini_inv(trop) register struct trobj *trop; {
  477. register struct obj *obj;
  478. extern struct obj *mkobj();
  479.     while(trop->trolet) {
  480.         obj = mkobj(trop->trolet);
  481.         obj->known = trop->trknown;
  482.         /* not obj->dknown = 1; - let him look at it at least once */
  483.         obj->cursed = 0;
  484.         if(obj->olet == WEAPON_SYM){
  485.             obj->quan = trop->trquan;
  486.             trop->trquan = 1;
  487.         }
  488.         if(trop->trspe != UNDEF_SPE)
  489.             obj->spe = trop->trspe;
  490.         if(trop->trotyp != UNDEF_TYP)
  491.             obj->otyp = trop->trotyp;
  492.         else
  493.             if(obj->otyp == WAN_WISHING)    /* gitpyr!robert */
  494.                 obj->otyp = WAN_DEATH;
  495.         obj->owt = weight(obj);    /* defined after setting otyp+quan */
  496.         obj = addinv(obj);
  497.  
  498.         /*
  499.          * if a magic item's 'known' bit is on, set its name known
  500.          */
  501.         if (IS_MAGIC(obj) && obj->known)
  502.             objects[obj->otyp].oc_name_known=1;
  503.  
  504.         if(obj->olet == ARMOR_SYM){
  505.             switch(obj->otyp){
  506.             case SHIELD:
  507.                 if(!uarms) setworn(obj, W_ARMS);
  508.                 break;
  509.             case HELMET:
  510.                 if(!uarmh) setworn(obj, W_ARMH);
  511.                 break;
  512.             case PAIR_OF_GLOVES:
  513.                 if(!uarmg) setworn(obj, W_ARMG);
  514.                 break;
  515. #ifdef SHIRT
  516.             case HAWAIIAN_SHIRT:
  517.                 if(!uarmu) setworn(obj, W_ARMU);
  518.                 break;
  519. #endif
  520.             case ELVEN_CLOAK:
  521.                 if(!uarm2)
  522.                     setworn(obj, W_ARM);
  523.                 break;
  524.             default:
  525.                 if(!uarm) setworn(obj, W_ARM);
  526.             }
  527.         }
  528.         /* below changed by GAN 01/09/87 to allow wielding of
  529.          * pick-axe or can-opener if there is no weapon
  530.          */
  531.         if(obj->olet == WEAPON_SYM || obj->otyp == PICK_AXE ||
  532.            obj->otyp == CAN_OPENER)
  533.             if(!uwep) setuwep(obj);
  534. #ifndef PYRAMID_BUG
  535.         if(--trop->trquan) continue;    /* make a similar object */
  536. #else
  537.         if(trop->trquan) {        /* check if zero first */
  538.             --trop->trquan;
  539.             if(trop->trquan)
  540.                 continue;    /* make a similar object */
  541.         }
  542. #endif
  543.         trop++;
  544.     }
  545. }
  546.  
  547. #ifdef WIZARD
  548. wiz_inv(){
  549. register struct trobj *trop = &Extra_objs[0];
  550. extern char *getenv();
  551. register char *ep = getenv("INVENT");
  552. register int type;
  553.     while(ep && *ep) {
  554.         type = atoi(ep);
  555.         ep = index(ep, ',');
  556.         if(ep) while(*ep == ',' || *ep == ' ') ep++;
  557.         if(type <= 0 || type > NROFOBJECTS) continue;
  558.         trop->trotyp = type;
  559.         trop->trolet = objects[type].oc_olet;
  560.         trop->trspe = 4;
  561.         trop->trknown = 1;
  562.         trop->trquan = 1;
  563.         ini_inv(trop);
  564.     }
  565. }
  566. #endif /* WIZARD /**/
  567.  
  568. plnamesuffix() {
  569. register char *p;
  570.     if(p = rindex(plname, '-')) {
  571.         *p = 0;
  572.         pl_character[0] = p[1];
  573.         pl_character[1] = 0;
  574.         if(!plname[0]) {
  575.             askname();
  576.             plnamesuffix();
  577.         }
  578.     }
  579. }
  580.  
  581. role_index(pc)
  582. char pc;
  583. {        /* must be called only from u_init() */
  584.         /* so that rolesyms[] is defined */
  585.     register char *cp;
  586.  
  587.     if(cp = index(rolesyms, pc))
  588.         return(cp - rolesyms);
  589.     return(-1);
  590. }
  591.